//进行axios二次封装：使得请求与响应拦截器
import axios ,{ AxiosInstance, AxiosResponse } from "axios";
import useUserStore from '@/store/modules/user';
//引入操作本地token工具方法
import { GET_TOKEN } from '@/utils/localstore';
// 定义扩展的请求实例接口
interface ExtendedAxiosInstance extends AxiosInstance {
    exportFile(url: string, params: any): Promise<AxiosResponse<Blob>>;
}
//第一步：利用axios对象的create方法，去创建axios实例（其他的配置：基础路径、超时的时间等）
let request:ExtendedAxiosInstance = axios.create({
    //基础路径
    baseURL: import.meta.env.VITE_APP_BASE_API,
    //超时时间设置
    timeout: 5000 
}) as ExtendedAxiosInstance;
//第二步，request实例添加请求拦截器
request.interceptors.request.use((config)=>{
    // config配置对象，headers属性请求头，经常给服务器端携带公共参数
    const token = GET_TOKEN();
    if(token){
        config.headers['token'] = token;
    }
    //返回配置对象
    return config;
})

// 第三步，响应拦截器
request.interceptors.response.use((response)=>{ 
    // 成功的回调
    // 简化数据  
    return (response.data as any);
},async (error)=>{    
    console.log('失败返回:',error)
    //失败的回调：处理网络的错误
    //定义一个变量：存储网络错误信息    
    let message = '';
    //http状态码
    // 考虑导出时不同返回格式 error.config.responseType == 'blob'
    let errorMessage = error.config.responseType != 'blob' ? error.response.data.message : error.response.data.text();
    let status = error.config.responseType != 'blob' ? error.response.data.status : error.response.status;
    switch(status){
        case 401:
            message = errorMessage;
            useUserStore().userLogout();
            break;
        case 403:
            message = "无权访问";
            break;
        case 404:
            message = "请求地址错误";
            break;
        case 500:
            if(error.config.responseType != 'blob'){
                message = errorMessage;
            }else{
                try {
                    const text = await errorMessage; // 等待读取完成
                    // console.log('原始文本:', text); // 打印整个字符串
                    const json = JSON.parse(text);
                    // console.log('解析后的message:', json.message); // 取出 message 字段
                    message = json.message; // 使用服务器返回的 message
                } catch (e) {
                    console.error('JSON解析失败', e);
                    message = '导出失败，无法解析错误信息';
                }
            }
            break;
        default:
            message = errorMessage;
            break;
    }
    //提示错误信息
    ElMessage.error(message);
    return Promise.reject(error);
})
// 扩展request实例，添加exportFile方法
request.exportFile = async function(url: string, params: any): Promise<AxiosResponse<Blob>> {
    return this.post(url, params, {
        responseType: 'blob',
        headers: { 'Content-Type': 'application/json' } // 如果需要上传文件，可以改为'multipart/form-data'
    });
};
export default request;
